import Config from "@/base/Config";
import { createCustomMethodDecorator } from "@midwayjs/core";
import { Context } from "@midwayjs/koa";

// 装饰器内部的唯一 id
export const MEMORY_CACHE_KEY = "decorator:ratelimit_memory_cache_key";
/** 限制接口数组 */
let RateLimitArr: string[] = [];
/** 限制接口对象集合 */
let RateLimitMap = new Map();

export type RateType = 0 | 1

/**
 * @param url 限制接口地址
 * @param max 限制次数 默认20次
 * @param duration 限制时间内 默认1秒
 * @param type 0 表示 ip+接口地址，1 表示 接口地址
 */
export function RateLimit(url: string = "/", max: number = 20, duration: number = 1, type: RateType = 1): MethodDecorator {

    RateLimitArr.push(Config.Koa.globalPrefix + url)

    RateLimitMap.set(Config.Koa.globalPrefix + url, {
        url: Config.Koa.globalPrefix + url,
        type,
        max,
        duration
    })

    return createCustomMethodDecorator(MEMORY_CACHE_KEY, {}, false);
}

export function GetArray() {
    return RateLimitArr;
}

export function GetMap() {
    return RateLimitMap;
}

/**
 * 判断是否为限制的接口
 */
export function HasUrl(ctx: Context) {
    let url = RateLimitArr.map((ite) => {
        if (ctx.path === ite) {
            return ctx.path
        }
    }).filter((ite) => ite)[0];
    return url
}